package shuaige.jdk.集合.先进先出队列.优先队列PriorityQueue;

import shuaige.jdk.model.User;

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;

public class PriorityQueueDemo {
    /**
     * 1. PriorityQueue和Queue的区别在于，它的出队顺序与元素的优先级有关，对PriorityQueue调用remove()或poll()方法，返回的总是优先级最高的元素。
     * 2. 放入PriorityQueue的元素，必须实现Comparable接口，PriorityQueue会根据元素的排序顺序决定出队的优先级。
     *
     * @param args
     */
    public static void main(String[] args) {
        // 使用 比较接口 UserComparator
        Queue<User> q = new PriorityQueue<>(new Comparator<User>() {
            @Override
            public int compare(User u1, User u2) {
                if (u1.getNumber().charAt(0) == u2.getNumber().charAt(0)) {
                    // 如果两人的号都是A开头或者都是V开头,比较号的大小:
                    return u1.getNumber().compareTo(u2.getNumber());
                }
                if (u1.getNumber().charAt(0) == 'V') {
                    // u1的号码是V开头,优先级高:
                    return -1;
                } else {
                    return 1;
                }
            }
        });
        // 添加3个元素到队列:
        q.offer(new User("Bob", "A1"));
        q.offer(new User("Alice", "A2"));
        q.offer(new User("Boss", "V1"));
        // Boss/V1
        System.out.println(q.poll());
        // Bob/A1
        System.out.println(q.poll());
        // Alice/A2
        System.out.println(q.poll());
        // null,因为队列为空
        System.out.println(q.poll());
    }
}
